package com.collabscm.waf.exception;

import java.io.PrintStream;
import java.io.PrintWriter;

/**
 * 平台捕捉到的异常，用于将CheckedException转换为UncheckedException，以便不让代码捕捉一些不必要的异常，
 * 并且使用此异常在堆栈信息打印时不会产生多余的堆栈信息。
 * @author Zeng Raoxing
 */
public class UncheckedException extends BaseRuntimeException {

	private static final long serialVersionUID = 1L;
	
	public UncheckedException(Throwable cause) {
		super("非检查的异常", PlatformExceptionConstants.UncheckedExceptionCode, getCauseException(cause), cause);
	}
	
	public UncheckedException(String message, Throwable cause) {
		super(message, PlatformExceptionConstants.UncheckedExceptionCode, getCauseException(cause), cause);
	}
	
	/**
	 * 得到原始异常信息
	 * @param cause
	 */
	public static String getCauseException(Throwable cause) {
		if(cause != null) {
			cause = ExceptionUtils.getRootCause(cause);
			return cause.getClass().getName() + ":" + cause.getMessage();
		} else {
			return "Cause Exception is null";
		}
	}
	
	/**
	 * 覆盖打印堆栈信息，将忽略掉UnchecedException的本身的堆栈信息。
	 */
	public void printStackTrace(PrintStream s) {
		s.print(getMessage());
		s.println(", The Exception is: ");
		super.getCause().printStackTrace(s);
	}

	/**
	 * 覆盖打印堆栈信息，将忽略掉UnchecedException的本身的堆栈信息。
	 */
	public void printStackTrace(PrintWriter s) {
		s.print(getMessage());
		s.println(", The Exception is: ");
		super.getCause().printStackTrace(s);
	}

}
